// Package api internal/api/post_api.go
package api

import (
	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
	"gozrd-admin-api/internal/entity/dto"
	"gozrd-admin-api/internal/repository"
	"gozrd-admin-api/internal/service"
	"gozrd-admin-api/pkg/response"
	"strconv"
)

// PostAPI 岗位控制器
type PostAPI struct {
	postService service.IPostService
}

// NewPostAPI 创建岗位控制器
func NewPostAPI(db *gorm.DB) *PostAPI {
	postRepo := repository.NewPostRepository(db)
	postService := service.NewPostService(postRepo)
	return &PostAPI{
		postService: postService,
	}
}

// CreateSysPost 新增岗位
// @Summary 新增岗位接口
// @Description 创建一个新的岗位
// @Tags 岗位
// @Accept json
// @Produce json
// @Param data body dto.SysPostDto true "岗位信息"
// @Success 200 {object} response.Response "创建成功"
// @Router /post [post]
func (p *PostAPI) CreateSysPost(c *gin.Context) {
	var postDTO dto.SysPostDto
	if err := c.ShouldBindJSON(&postDTO); err != nil {
		response.Fail(c, response.ErrParams, err.Error())
		return
	}

	p.postService.CreateSysPost(c, postDTO)
}

// GetSysPostList 分页查询岗位列表
// @Summary 分页查询岗位列表
// @Description 分页查询岗位列表
// @Tags 岗位
// @Accept json
// @Produce json
// @Param pageNum query int false "分页数"
// @Param pageSize query int false "每页数"
// @Param postName query string false "岗位名称"
// @Param postStatus query string false "状态：1->启用,2->禁用"
// @Param beginTime query string false "开始时间"
// @Param endTime query string false "结束时间"
// @Success 200 {object} response.Response "返回岗位列表"
// @Router /post/list [get]
func (p *PostAPI) GetSysPostList(c *gin.Context) {
	// 解析分页参数
	pageNum, _ := strconv.Atoi(c.DefaultQuery("pageNum", "1"))
	pageSize, _ := strconv.Atoi(c.DefaultQuery("pageSize", "10"))

	// 解析查询条件
	postName := c.Query("postName")
	postStatus := c.Query("postStatus")
	beginTime := c.Query("beginTime")
	endTime := c.Query("endTime")

	p.postService.GetSysPostList(c, pageNum, pageSize, postName, postStatus, beginTime, endTime)
}

// GetSysPostById 根据id查询岗位
// @Summary 根据id查询岗位
// @Description 获取指定ID的岗位信息
// @Tags 岗位
// @Accept json
// @Produce json
// @Param id path int true "岗位ID"
// @Success 200 {object} response.Response "返回岗位信息"
// @Router /post/{id} [get]
func (p *PostAPI) GetSysPostById(c *gin.Context) {
	idStr := c.Param("id")
	id, err := strconv.Atoi(idStr)
	if err != nil {
		response.Fail(c, response.ErrParams, "无效的ID参数")
		return
	}

	p.postService.GetSysPostById(c, id)
}

// UpdateSysPost 修改岗位
// @Summary 修改岗位接口
// @Description 更新岗位信息
// @Tags 岗位
// @Accept json
// @Produce json
// @Param data body dto.SysPostDto true "岗位信息"
// @Success 200 {object} response.Response "更新成功"
// @Failure 400 {object} response.Response "请求错误"
// @Failure 500 {object} response.Response "内部错误"
// @Router /post [put]
func (p *PostAPI) UpdateSysPost(c *gin.Context) {
	var postDTO dto.SysPostDto
	if err := c.ShouldBindJSON(&postDTO); err != nil {
		response.Fail(c, response.ErrParams, err.Error())
		return
	}

	p.postService.UpdateSysPost(c, postDTO)
}

// DeleteSysPostById 根据id删除岗位
// @Summary 根据id删除岗位接口
// @Description 删除指定ID的岗位
// @Tags 岗位
// @Accept json
// @Produce json
// @Param data body dto.SysPostIdDto true "岗位ID"
// @Success 200 {object} response.Response "删除成功"
// @Router /post [delete]
func (p *PostAPI) DeleteSysPostById(c *gin.Context) {
	var idDTO dto.SysPostIdDto
	if err := c.ShouldBindJSON(&idDTO); err != nil {
		response.Fail(c, response.ErrParams, err.Error())
		return
	}

	p.postService.DeleteSysPostById(c, idDTO)
}

// BatchDeleteSysPost 批量删除岗位
// @Summary 批量删除岗位接口
// @Description 批量删除指定ID的岗位
// @Tags 岗位
// @Accept json
// @Produce json
// @Param data body dto.DelSysPostDto true "岗位ID列表"
// @Success 200 {object} response.Response "删除成功"
// @Router /post/batch [delete]
func (p *PostAPI) BatchDeleteSysPost(c *gin.Context) {
	var delDTO dto.DelSysPostDto
	if err := c.ShouldBindJSON(&delDTO); err != nil {
		response.Fail(c, response.ErrParams, err.Error())
		return
	}

	p.postService.BatchDeleteSysPost(c, delDTO)
}

// UpdateSysPostStatus 岗位状态修改
// @Summary 岗位状态修改接口
// @Description 修改岗位的状态
// @Tags 岗位
// @Accept json
// @Produce json
// @Param data body dto.UpdateSysPostStatusDto true "岗位状态信息"
// @Success 200 {object} response.Response "修改成功"
// @Router /post/status [put]
func (p *PostAPI) UpdateSysPostStatus(c *gin.Context) {
	var statusDTO dto.UpdateSysPostStatusDto
	if err := c.ShouldBindJSON(&statusDTO); err != nil {
		response.Fail(c, response.ErrParams, err.Error())
		return
	}

	p.postService.UpdateSysPostStatus(c, statusDTO)
}

// QuerySysPostVoList 岗位下拉列表
// @Summary 岗位下拉列表接口
// @Description 获取岗位下拉选项列表
// @Tags 岗位
// @Accept json
// @Produce json
// @Success 200 {object} response.Response "返回岗位下拉列表"
// @Router /post/list/options [get]
func (p *PostAPI) QuerySysPostVoList(c *gin.Context) {
	p.postService.QuerySysPostVoList(c)
}

// SetPostServiceForTest 设置岗位服务，仅供测试使用
func SetPostServiceForTest(p *PostAPI, svc service.IPostService) {
	p.postService = svc
}
